온라인 저지

일반적으로 PS 공부를 할 때는 각종 온라인 저지 사이트를 이용합니다. 이 사이트들은 내가 문제를 푼 소스를 제출하면 그 소스가 맞는지 채점을 해주기 때문에 공부하는데 굉장히 큰 도움이 됩니다.

이러한 채점은 일반적으로 표준 입출력(standard input output)을 기반으로 동작합니다. 표준 입출력은 C++의 경우 scanf/printf, python의 경우 input/print와 같이 우리가 흔히 콘솔 창이라고 부르는 화면에서 입력하고 출력하는 것을 의미합니다.

이 자료는 국내에서 가장 다양한 언어와 문제를 제공하는 백준 온라인 저지(BOJ)의 문제들을 연습 문제로 사용합니다.

온라인 저지를 사용해 본 적 없는 분들을 위해, 간단한 예시 문제를 하나 풀고 넘어가 봅시다. 위 사이트에 가입해서 직접 아래 문제를 풀어보세요.

2557. Hello, World

문제 링크

프로그래밍 수업 등에서 보통 가장 간단한 예제로 사용되는 Hello World!를 출력하는 프로그램을 작성하는 문제입니다.

문제 페이지를 자세히 보면, 아래의 몇 가지 요소들을 확인할 수 있습니다.

  • 예시 입출력
  • 시간 제한
  • 메모리 제한

예시 입출력

예시 입출력은 문제의 입력과 출력 포맷 확인 및 문제의 이해를 돕기 위해 주어지는 예시입니다. 내가 작성한 프로그램이 이 예시에 있는 입력을 콘솔 창으로부터(표준 입출력을 사용하여) 입력 받아서 주어진 예시에 있는 것과 완벽하게 동일한 출력을 내야 정답이 됩니다.

이 점이 중요한데, 문제의 답과 조금이라도 다른 출력을 내면 오답이 됩니다. 즉, Hello World! 대신에 Hello World를 출력하거나 hello world!를 출력하거나 Hello, World!를 출력하면 전부 오답으로 취급된다는 것입니다. 이런 조금의 실수도 허용되지 않는 것은 내가 올바르게 프로그램을 작성했는지에 대한 채점을 사람이 직접하는 게 아니기 때문입니다.

온라인 저지 사이트에서의 채점은 미리 해당 문제에 대한 테스트 케이스, 그러니까 채점을 위한 입력 파일과 거기에 대응되는 출력 파일을 이용해서 컴퓨터가 자동으로 수행합니다. 컴퓨터는 자신이 알고 있는 테스트 케이스의 입력을 우리가 작성한 프로그램에 대입하고, 그 프로그램이 만들어 낸 출력을 다시 자신이 갖고 있는 출력 파일과 비교합니다. 내 프로그램이 낸 출력과 이 출력 파일의 내용이 완벽히 같으면 정답으로 취급하고, 아니면 오답으로 취급합니다.

또, 사이트마다 조금씩 차이가 있긴 하지만 일반적으로 테스트 케이스는 공개되지 않습니다. 내 프로그램이 무엇 때문에 틀렸는지 가르쳐 주지 않는다는 의미입니다. 이게 답답하게 느껴질 수도 있지만, 내 프로그램의 버그를 잡아내는 것 역시 프로그래밍에서 굉장히 중요한 능력입니다. 테스트 케이스를 확인할 수 있는 경우 이런 디버깅 능력을 키우기가 힘듭니다. 내 알고리즘을 반례를 직접 생각해내지 않고 사이트에서 제공되는 테스트 케이스를 보고 반례를 찾게 되기 때문입니다. 좀 답답하더라도 다양한 테스트 케이스를 직접 만들어보고, 코드를 꼼꼼히 읽으면서 디버깅하는 습관을 키우는 것이 좋습니다. 디버깅은 중요한 내용이기 때문에 나중에 다시 한 번 깊이 있게 다루게 될 것입니다.

시간 제한

문제들마다 보통 시간제한이 1초 정도에서 긴 것은 4~5초까지 주어져 있습니다. 이 시간 제한은 문제를 그 시간 안에 풀어야 한다는 뜻이 아니라, 내가 짠 프로그램이 주어진 시간 제한 안에 주어진 입력에 대한 정답을 출력해야 한다는 뜻입니다. 즉, 프로그램의 실행 시간이 주어진 시간 제한을 넘으면 안 된다는 뜻입니다.

이는 흔히 시간 복잡도라고 불리는 알고리즘의 효율성을 보기 위해서 주어집니다. 같은 문제라도 푸는 방법에 따라 답을 구하는데 0.001초도 안 걸리는 알고리즘이 있고, 한시간 두시간이 지나도 답을 구할 수 없는 알고리즘이 있습니다. 이 시간 제한은 문제를 만든 사람이 의도한 수준의 효율성을 가진 프로그램만이 정답을 받을 수 있게 하기 위해 주어집니다. 올바른 답을 내더라도 시간 제한을 만족하지 못하는 프로그램은 정답 대신 시간 초과(Time Limit Exceeded, TLE)를 받고 틀리게 됩니다.

메모리 제한

메모리 제한은 주어진 프로그램이 제한 안쪽의 메모리 만을 이용해서 동작해야한다는 뜻입니다. 일반적으로 특수한 문제들을 제외하고는 메모리 제한을 신경써야 하는 경우는 잘 없습니다. 특히나 쉬운 문제들은 딱히 메모리 제한을 신경 쓸 필요는 없기 때문에, 당장은 별로 신경쓰지 않아도 됩니다. 메모리 제한을 신경 써야 하는 문제들 역시 나중에 다루게 되기 때문에 그 문제들을 풀 때 메모리에 관한 것을 자세히 배워 봅시다. 메모리 제한을 넘은 프로그램 역시 정답 대신 메모리 초과(Memory Limit Exceeded, MLE)를 받고 틀리게 됩니다.

풀이

이제 실제로 이 문제의 풀이를 작성해 봅시다. 이 문제는 단순히 주어진 문자열을 콘솔 창에 출력하면 풀리는 문제입니다. 자기가 사용하는 언어의 출력 함수를 이용해서 Hello World!를 출력해 봅시다.

C++
#include <stdio.h>

int main()
{
    printf("Hello World!");
    return 0;
}

혹은, printf 대신에 C++의 출력 함수인 cout을 사용해도 됩니다.

#include <iostream>

using namespace std;

int main()
{
    cout << "Hello World!";
    return 0;
}
python
print("Hello World!")

코드를 모두 작성했다면 문제 상단의 제출 버튼을 이용해서 소스 코드를 제출하면 됩니다. 제출한 코드는 맞았습니다/틀렸습니다/시간 초과/컴파일 에러 등의 채점 결과를 받을 수 있습니다.

이 때 컴파일 에러의 경우, 컴파일 에러라고 적힌 부분을 클릭하면 무슨 이유로 컴파일 에러가 났는지 확인해 볼 수 있습니다. 백준 사이트 상에서 사용하는 C++ 컴파일러는 gcc인데, 자신이 C++ 코딩을 하는 환경이 visual studio등 다른 환경이라면 자신의 컴퓨터에서는 컴파일이 되는데 제출시에는 컴파일이 안 될 수 있습니다. 이럴 때는 꼭 무엇 때문에 컴파일 에러가 났는지 확인해보도록 합시다.

results matching ""

    No results matching ""